/**
 * @author LYC
 * 日期和时间工具函数
 * 基于VueUse的日期辅助函数进行二次封装
 */
import { useTimeAgo } from '@vueuse/core'
import { unref } from 'vue'
import type { MaybeRefOrGetter } from 'vue'

/**
 * 格式化聊天消息时间
 * @param date 日期对象或时间戳
 * @returns 格式化后的时间字符串
 */
export function formatMessageTime(date: Date | number | null | undefined): string {
  if (!date) return ''

  const dateObj = date instanceof Date ? date : new Date(date)
  const now = new Date()
  const diffTime = now.getTime() - dateObj.getTime()
  const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24))

  if (diffDays === 0) {
    // 今天 - 显示时:分
    return dateObj.toLocaleTimeString('zh-CN', {
      hour: '2-digit',
      minute: '2-digit',
      hour12: false
    })
  } else if (diffDays === 1) {
    // 昨天
    return '昨天'
  } else if (diffDays < 7) {
    // 一周内 - 显示星期几
    return ['周日', '周一', '周二', '周三', '周四', '周五', '周六'][dateObj.getDay()]
  } else {
    // 超过一周 - 显示月/日
    return dateObj.toLocaleDateString('zh-CN', {
      month: 'numeric',
      day: 'numeric'
    })
  }
}

/**
 * 使用VueUse的useTimeAgo获取相对时间
 * @param date 日期对象或时间戳
 * @returns 计算属性，返回相对时间字符串
 */
export function useRelativeTime(
  date: MaybeRefOrGetter<Date | number | string>
): ReturnType<typeof useTimeAgo> {
  const timeAgo = useTimeAgo(date, {
    messages: {
      justNow: '刚刚',
      past: (n) => (n.match(/\d/) ? `${n}前` : n),
      future: (n) => (n.match(/\d/) ? `${n}后` : n),
      month: (n, past) => (n === 1 ? (past ? '上个月' : '下个月') : `${n} 个月`),
      year: (n, past) => (n === 1 ? (past ? '去年' : '明年') : `${n} 年`),
      day: (n, past) => (n === 1 ? (past ? '昨天' : '明天') : `${n} 天`),
      week: (n, past) => (n === 1 ? (past ? '上周' : '下周') : `${n} 周`),
      hour: (n) => `${n} 小时`,
      minute: (n) => `${n} 分钟`,
      second: (n) => `${n} 秒`,
      invalid: '无效日期'
    }
  })

  return timeAgo
}

/**
 * 格式化最后活跃时间
 * @param date 日期对象或时间戳
 * @returns 格式化后的时间字符串
 */
export function formatLastSeen(date: MaybeRefOrGetter<Date | number | undefined>): string {
  const dateValue = unref(date)
  if (!dateValue) return '未知'

  // 确保dateValue不为undefined
  const safeDate = dateValue as Date | number

  // 使用formatMessageTime而不是useRelativeTime
  return formatMessageTime(safeDate)
}

/**
 * 格式化详细时间（用于消息详情等）
 * @param date 日期对象或时间戳
 * @returns 格式化后的详细时间字符串 (yyyy-MM-dd HH:mm:ss)
 */
export function formatDetailTime(date: Date | number | null | undefined): string {
  if (!date) return ''

  const dateObj = date instanceof Date ? date : new Date(date)

  const year = dateObj.getFullYear()
  const month = String(dateObj.getMonth() + 1).padStart(2, '0')
  const day = String(dateObj.getDate()).padStart(2, '0')
  const hours = String(dateObj.getHours()).padStart(2, '0')
  const minutes = String(dateObj.getMinutes()).padStart(2, '0')
  const seconds = String(dateObj.getSeconds()).padStart(2, '0')

  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}

/**
 * 格式化日期（用于文件列表等）
 * @param date 日期对象或时间戳
 * @returns 格式化后的日期字符串 (yyyy-MM-dd)
 */
export function formatDate(date: Date | number | null | undefined): string {
  if (!date) return ''

  const dateObj = date instanceof Date ? date : new Date(date)

  const year = dateObj.getFullYear()
  const month = String(dateObj.getMonth() + 1).padStart(2, '0')
  const day = String(dateObj.getDate()).padStart(2, '0')

  return `${year}-${month}-${day}`
}

/**
 * 检查日期是否为今天
 * @param date 日期对象或时间戳
 * @returns 是否为今天
 */
export function isToday(date: Date | number): boolean {
  const dateObj = date instanceof Date ? date : new Date(date)
  const today = new Date()

  return (
    dateObj.getDate() === today.getDate() &&
    dateObj.getMonth() === today.getMonth() &&
    dateObj.getFullYear() === today.getFullYear()
  )
}

/**
 * 检查日期是否为昨天
 * @param date 日期对象或时间戳
 * @returns 是否为昨天
 */
export function isYesterday(date: Date | number): boolean {
  const dateObj = date instanceof Date ? date : new Date(date)
  const yesterday = new Date()
  yesterday.setDate(yesterday.getDate() - 1)

  return (
    dateObj.getDate() === yesterday.getDate() &&
    dateObj.getMonth() === yesterday.getMonth() &&
    dateObj.getFullYear() === yesterday.getFullYear()
  )
}

/**
 * 获取日期分组标签（今天、昨天、日期）
 * @param date 日期对象或时间戳
 * @returns 日期分组标签
 */
export function getDateGroupLabel(date: Date | number): string {
  if (isToday(date)) {
    return '今天'
  } else if (isYesterday(date)) {
    return '昨天'
  } else {
    return formatDate(date)
  }
}
